package ikastola

import java.util.Date;
import java.util.Map;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import org.ikastola.DateDiscount
import org.joda.time.Days
import org.joda.time.LocalDate
import org.joda.time.Months
import org.ikastola.BalanceFees
import org.ikastola.Fee
import org.ikastola.FeeInter
import org.ikastola.Service
import org.ikastola.Student
import org.springframework.transaction.annotation.Transactional

import utils.Utils;

@Transactional(readOnly = true)
class DateUtilService {


	/**
	 * Retorna bonificaciones por pago en termino:
	 * Actualmente aplica solo para cuotas: 
	 * Costo abonando entre el 1 y el 10 - descuento de 
	 * Costo abonando entre el 11 y el 20 - descuento de 
	 * Costo abonando entre el 21 y 30-31 - sin descuento
	 * 
	 * @return
	 */
	def getDateDiscount(BalanceFees b) {
		int ini = 0
		int end = 0
		LocalDate today = new LocalDate()
		DateDiscount discount = null
		
		Fee fee = b.getFee()
		LocalDate nextPayment = new LocalDate(b.getPaymentdate())

		if (Constants.FEE_PERIOD_MONTH.equals(fee.getPeriod())) { //solo para fee mensuales
			
			def dateDiscounts = DateDiscount.findAllByFeeAndDeleted(fee,Constants.NOT_DELETED)
			
			if (nextPayment.getMonthOfYear() == today.getMonthOfYear() 
				&& nextPayment.getYear() == today.getYear()) { //si el proximo pago es del mismo año y mes actual
			
				for (DateDiscount d in dateDiscounts) {
					ini = d.getIniday()
					end = d.getEndday()
					if (ini <= today.getDayOfMonth() && end >= today.getDayOfMonth()) {
						discount = d
					}
				}
			}
		}

		return discount
	}

	/**
	 * Retorna cargo por mes vencido - Actualmente 2.5% por mes
	 * (ejemplo: abonando el mes siguiente $758 , 
	 * dos meses después $777, tres meses después $796 y asi sucesivamente)
	 * 
	 * Devuelve el porcentaje a adicionar - Actualmente aplica sobre la deuda acumulada
	 * 
	 * La lista de balances ya tienen el mes del proximo pago para tarifas mensuales y
	 * el año del proximo pago (para tarifas anuales)
	 * @param balanceFees
	 * @return
	 */
	def getDueInterest(BalanceFees b) {

		Double percentToAdd = 0.0
		int currentMonth =  new LocalDate().getMonthOfYear()
		//por la tarifa en b, recupero el interes correspondiente si lo hubiere
		Fee fee = b.getFee()
		if ("1".equals(fee.getPeriod())) { //por ahora solo se toman deudas de tarifas mensiales - falta definir que hacer para las anuales (matricula)
			//FeeInter inter = FeeInter.findByFeeAndDeleted(b.getFee(),Constants.NOT_DELETED)
			FeeInter inter = FeeInter.findByFeeAndDeleted(null, Constants.NOT_DELETED)
			if(inter) {
				int nextPaymentMonth = new LocalDate(b.getPaymentdate()).getMonthOfYear()					
				int monthDiff = currentMonth - nextPaymentMonth
				if (monthDiff > 0) {
					percentToAdd = inter.getPercent() * monthDiff * 0.01
				}
			}
		}
		return Utils.round(percentToAdd)	
	}

	/**
	 * 
	 * @param service
	 * @return
	 */
/*	def getNextDueDate(Service service) {
		
		LocalDate nextdue = new LocalDate()
		int day = 0

		List<Fee> monthlys = service.getMonthlyFees()
		if (monthlys) {
			for (f in monthlys) {
				if (day < f.getDueday()) {
					day = f.getDueday()
				}
			}
		} else {
			List<Fee> annuals = service.getAnnualFees()
			for (f in annuals) {
				if (day < f.getDueday()) {
					day = f.getDueday()
				}
			}
		}
		nextdue = nextdue.withDayOfMonth(day).plusMonths(1)
		return nextdue.toDate()
	}
	
	
	def boolean isPaidFee(Fee fee, Student student, Date date) {
		LocalDate ldate = new LocalDate(date)
		String query = "";
		List<BalanceFees> fees = []
		if (fee.getPeriod().equals("1")) { //mensual
			query = "from BalanceFees as b where b.student = ? and b.fee = ? and YEAR(b.payfordate) = ? and MONTH(b.payfordate) = ?"
			fees = BalanceFees.executeQuery(query, [student, fee, ldate.getYear(), ldate.getMonthOfYear()],[readOnly: true])
		} else {
			query = "from BalanceFees as b where b.student = ? and b.fee = ? and YEAR(b.payfordate) = ?"
			fees = BalanceFees.executeQuery(query, [student, fee, ldate.getYear()],[readOnly: true])
		}
		
		if (!fees.isEmpty()) {
			return true
		}
		return false
	}
*/
}
//LocalDate nextduedate = new LocalDate(2013,5,10) //TEST
/*DecimalFormat format = new DecimalFormat("#####0.00")
 DecimalFormatSymbols symbols = new DecimalFormatSymbols();
 symbols.setDecimalSeparator('.')
 symbols.setGroupingSeparator(',')
 format.setDecimalFormatSymbols(symbols)*/
